package com.idealighter.game.games.fqzs.convert;

import com.idealighter.game.gamehall.dto.MemInfo;
import com.idealighter.game.games.common.AbstractRoom;
import com.idealighter.game.games.fqzs.dto.BetInfo;
import com.idealighter.game.games.fqzs.dto.IconRateInfo;
import com.idealighter.game.games.fqzs.message.ResGameInfoMsg;
import com.idealighter.game.games.fqzs.message.ResGameInfoMsg.BankerAndApplysInfo;
import com.idealighter.game.games.fqzs.message.ResGameInfoMsg.BankerInfoMsg;
import com.idealighter.game.games.fqzs.message.ResGameInfoMsg.GameStageInfo;
import com.idealighter.game.games.fqzs.message.ResGameInfoMsg.StageInfo;
import com.idealighter.game.games.fqzs.message.ResGameInfoMsg.TopRewardItemDto;
import com.idealighter.game.games.fqzs.struct.SharkSeat;
import com.idealighter.game.games.fqzs.struct.SharkTable;
import com.idealighter.game.games.fqzs.struct.SharkTable.TopRewardItem;
import com.idealighter.game.games.fqzs.struct.SharkTableStatus;

import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
import java.util.concurrent.TimeUnit;

import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

@Mapper
public abstract class SharkGameCurInfoConvert {
  public static final SharkGameCurInfoConvert INSTANCE =
      Mappers.getMapper(SharkGameCurInfoConvert.class);

  /**
   * 提取游戏当前信息.
   * 
   * @Title toSharkGameCurInfo.
   * @author houdongsheng
   * @date 2018年1月15日 下午8:25:48
   * @param seat 座位信息
   * @return SharkGameCurInfo
   */
  public ResGameInfoMsg toSharkGameCurInfo(SharkSeat seat) {
    ResGameInfoMsg result = new ResGameInfoMsg();
    SharkTable table = seat.getTable();
    result.setBankerAndApplysInfo(toBankerAndApplysInfo(table));
    result.setStageInfo(toStageInfo(table));
    result.setHistoryRewardIcons(new ArrayList<Integer>(table.getHistoryRewardIcons()));
    result.setMems(new ArrayList<>()); // toMemInfoList(table)
    result.setIconRateInfos(toIconRateList(table));
    result.setBetInfos(toBetInfoList(table));
    result.setGaming(toGameStageInfo(seat));
    result.setTotalChips(seat.getTotalChips());

    return result;
  }

  /**
   * 提取正在游戏中的数据.
   * 
   * @Title toGameStateInfo.
   * @author houdongsheng
   * @date 2018年1月15日 下午8:24:25
   * @param seat 座位信息
   * @return GameStageInfo
   */
  public GameStageInfo toGameStageInfo(SharkSeat seat) {
    SharkTable table = seat.getTable();
    SharkSeat banker = table.getBanker();
    List<TopRewardItemDto> topRewards = toTopRewardItemDto(table.getTopRewards());
    GameStageInfo result = new GameStageInfo();
    result.setBankerBillChips(banker.getBillChips());
    result.setPlayerBillChips(seat.getBillChips());
    result.setIconIndex(table.getRewardIcon());
    result.setTopRewards(topRewards);

    return result;
  }

  public abstract List<TopRewardItemDto> toTopRewardItemDto(List<TopRewardItem> item);

  /**
   * 转换成TopRewardItemDto.
   * 
   * @Title toTopRewardItemDto.
   * @author houdongsheng
   * @date 2018年1月15日 下午8:23:43
   * @param item TopRewardItem
   * @return TopRewardItemDto
   */
  public TopRewardItemDto toTopRewardItemDto(TopRewardItem item) {
    TopRewardItemDto result = null;
    if (item != null) {
      result = new TopRewardItemDto();
      result.setChips(item.getChips());
      result.setNickName(item.getNickName());
      result.setPlayerId(item.getId());
    }
    return result;
  }

  /**
   * 提取桌子的下注信息.
   * 
   * @Title toBetInfoList.
   * @author houdongsheng
   * @date 2018年1月15日 下午8:13:17
   * @param table 桌子
   * @return List&lt;BetInfo&gt;
   */
  public List<BetInfo> toBetInfoList(SharkTable table) {
    List<BetInfo> list = new ArrayList<BetInfo>();
    for (Entry<Integer, Long> tableBetEtr : table.getTableBets().entrySet()) {
      BetInfo betInfo = new BetInfo();
      betInfo.setIcon(tableBetEtr.getKey());
      betInfo.setBet(tableBetEtr.getValue());
      list.add(betInfo);
    }
    return list;
  }

  /**
   * 提取icon赔率.
   * 
   * @Title toIconRateList.
   * @author houdongsheng
   * @date 2018年1月15日 下午8:08:26
   * @param table 桌子
   * @return List&lt;IconRateInfo&gt;
   */
  public List<IconRateInfo> toIconRateList(SharkTable table) {
    List<IconRateInfo> result = new ArrayList<IconRateInfo>();
    for (Entry<Integer, Integer> iconRatEtr : table.getIconRates().entrySet()) {
      IconRateInfo iconRateInfo = new IconRateInfo();
      iconRateInfo.setIcon(iconRatEtr.getKey());
      iconRateInfo.setRate(iconRatEtr.getValue());
      result.add(iconRateInfo);
    }
    return result;
  }

  /**
   * 构建StageInfo.
   * 
   * @Title toStageInfo.
   * @author houdongsheng
   * @date 2018年1月15日 下午7:33:43
   * @param table 桌子信息
   * @return StageInfo
   */
  public StageInfo toStageInfo(SharkTable table) {
    StageInfo result = new StageInfo();
    long leftTime = table.stepFuture.getDelay(TimeUnit.SECONDS);
    SharkTableStatus status = table.getStatus();
    result.setLeftTime(leftTime);
    result.setStatus(status.val);

    return result;
  }

  /**
   * 提取桌子成员信息.
   * 
   * @Title toMemInfoList.
   * @author houdongsheng
   * @date 2018年1月15日 下午8:04:33
   * @param table 桌子
   * @return List&lt;MemInfo&gt;
   */
  public List<MemInfo> toMemInfoList(SharkTable table) {
    AbstractRoom room = table.room();
    List<MemInfo> mems = new ArrayList<>();
    for (Long playerId : table.players()) {
      mems.add(room.memInfo(playerId));
    }
    return mems;
  }

  /**
   * 提取庄家信息和申请列表.
   * 
   * @Title toBankerAndApplysInfo.
   * @author houdongsheng
   * @date 2018年1月15日 下午7:56:54
   * @param table 桌子
   * @return BankerAndApplysInfo
   */
  public BankerAndApplysInfo toBankerAndApplysInfo(SharkTable table) {
    BankerAndApplysInfo result = new BankerAndApplysInfo();
    result.setBanker(toResBankerInfoMsg(table.getBanker()));
    result.setBankerApplys(new ArrayList<Long>(table.getApplyBankers()));
    return result;
  }

  /**
   * 设置庄家信息.
   * 
   * @Title toResBankerInfoMsg.
   * @Description
   * @author houdongsheng
   * @date 2018年1月15日 下午7:54:59
   * @param banker 庄家桌子
   * @return 庄家信息
   */
  public BankerInfoMsg toResBankerInfoMsg(SharkSeat banker) {
    BankerInfoMsg result = new BankerInfoMsg();
    result.setPlayerId(banker.getPlayerId());
    result.setChips(banker.getTotalChips());
    result.setName(banker.getPlayerName());
    result.setNum(banker.getBankerNum());
    result.setScore(banker.getBankerScore());

    return result;
  }
}
